Porcine Pancreas Ductal Organoids - 02 - Plotting Volcanos and GO Analyses

Author

Falk Janos Farkas

Published

August 15, 2025

1 Experimental Setup

Comparison of proteome between porcine pancreatic ductal organoids of different passages and donor ages. Organoids were derived from Embryonic, early postnatal and adult animals and cultured. For the early postnatal derived organoids, early and late passages were used to isolate proteins and investigate proteomic differences.

1.1 Saving

Code
path_figures <- paste(path_results, "Analysis","Plots", sep = "/")
########################


########################

save = T

#######################



if (save) {
  dir.create(paste(path_figures,  date, sep = "/"))

  fig_dir = paste(path_figures,  date, sep = "/")
  paste("Saving plots into folder:" , fig_dir)
  figname <- paste("KAK386_PIG_organoids")
}
Warning in dir.create(paste(path_figures, date, sep = "/")):
'/Users/falk.farkas/Documents/Proteomics_analysis_Christos_Falk/Pig_Organoids/Analysis/Plots/20250815'
already exists
Code
print(c("Saving plots into folder is:" , save))
[1] "Saving plots into folder is:" "TRUE"                        

2 Load Summarized Experiment

Code
sample_name <- "Pig_Organoid_Comparison"
 
filename <- "KAK386_Pig_BSG_PGSpec_Spec20.xlsx"

samples <- read_excel(paste(path_results, filename, sep = "/"), col_names = T , sheet = "Sample sheet")

filename <- "20250806_KAC386_Pig_organoids_SE_marked.rds"

se_data <- readRDS(paste(path_results, filename, sep = "/"))


se_data
class: SummarizedExperiment 
dim: 8377 12 
metadata(0):
assays(1): ''
rownames(8377): SAMHD1 FZD6 ... SP100 ALDH3B2
rowData names(53): Accession Genes ... PN_lateP_vs_Embryo_significant
  significant
colnames(12): Embryo_1 Embryo_2 ... Adult_2 Adult_3
colData names(4): label ID replicate condition

Embryonic data consists of only 2 replicates that are biological. The third replicate is a technical one of CK1_1

Code
sample_color_pallette <- c(viridis(3,begin = 0.005, end = 0.40), viridis(4,begin = 0.55, end = 0.97))

sample_color <- c( "#99d8c9","#238A8DFF", "#2ca25f", "#deebf7" ,"#a6bddb", "#2b8cbe" ,"#f19fdd" ,"#fa9fb5","#c51b8a","#FDE725FF", "#fec44f","#e34a33" )

names(sample_color) <- samples %>% pull(Sample)
sample_color_vec <- sample_color

volcano_color <- c("#61308a",
                   "#308a3c"  )
# "#440154FF" "#481568FF" "#482677FF" "#453781FF" "#3F4788FF" "#39558CFF" "#32648EFF" "#2D718EFF" "#287D8EFF" "#238A8DFF" "#1F968BFF" "#20A386FF" "#29AF7FFF" "#3CBC75FF" "#56C667FF" "#74D055FF" "#94D840FF" "#B8DE29FF" "#DCE318FF" "#FDE725FF"

aspect_ratio_pca = 1
aspect_ratio_volcano = .5

3 Volcano

Code
se_data %>% DEP2::get_contrast() -> contrasts
Code
for (contrast in contrasts){
  se_data %>%  plot_volcano(. , contrast = contrast , adjusted = T, 
               add_threshold_line = "intersect", pCutoff  = 0.05, fcCutoff = 1., add_names = T, 
               label_size = 4, dot_size = 1, 
               
               up_color = volcano_color[1] , #volcano_color["UP_color"] %>% unlist, 
               down_color =volcano_color[2] 
               )+
   # xlim(-7.5,7.5)+
   #ylim(0,5.5)+
    theme_cowplot()+
    theme(legend.position = "none")  -> p
  print(p)
  
}

Code
if (save & (aspect_ratio_volcano != 1)) {
  for (contrast in contrasts){
    se_data %>%  plot_volcano(. , contrast = contrast , adjusted = T, 
                 add_threshold_line = "intersect", pCutoff  = 0.05, fcCutoff = 1., add_names = T, 
                 label_size = 4, dot_size = 1,
                 up_color = volcano_color[1] , #volcano_color["UP_color"] %>% unlist, 
                 down_color =volcano_color[2] 
                 )+
      xlim(-7.5,7.5)+
      ylim(0,5.5)+
      theme_cowplot()+
      theme(legend.position = "none", aspect.ratio = aspect_ratio_volcano) -> p

    filename <- paste(date,figname, "Volcano_aspect", contrast, ".pdf", sep = "_", collapse = "")
    ggsave(filename,  device = NULL , path = fig_dir)
  }
}
if (save) {
  for (contrast in contrasts){
    se_data %>%  plot_volcano(. , contrast = contrast , adjusted = T, 
                 add_threshold_line = "intersect", pCutoff  = 0.05, fcCutoff = 1., add_names = T, 
                 label_size = 4, dot_size = 1,
                 up_color = volcano_color[1] ,
                 down_color =volcano_color[2] 
                 )+
      xlim(-7.5,7.5)+
      ylim(0,5.5)+
      theme_cowplot()+
      theme(legend.position = "none", aspect.ratio = 1) -> p

    filename <- paste(date,figname, "Volcano_sq", contrast, ".pdf", sep = "_", collapse = "")
    ggsave(filename,  device = NULL , path = fig_dir)
  }
}

4 Heatmap

Code
plot_heatmap(se_data, column_title = paste("Protein Abundance in", str_replace_all(sample_name, "_"," ")), col_font_size = 8, clustering_distance = "euclidean", type = "contrast")

Code
if (save) {
  filename <- paste(date, figname, "Heatmap_conditions.pdf", sep = "_")
  filepath <- file.path(fig_dir, filename)

  pdf(filepath, width = 10, height = 5)  # Adjust size if needed
  plot_heatmap(se_data,
                              column_title = paste("Protein Abundance in", sample_name),
                              col_font_size = 8,
                              clustering_distance = "euclidean",
                              type = "contrast")

  dev.off()
}
quartz_off_screen 
                2 
Code
plot_heatmap(se_data, column_title = paste("Protein Abundance in", str_replace_all(sample_name, "_", " ")), col_font_size = 10, clustering_distance = "euclidean", type = "centered")

Code
if (save) {
  filename <- paste(date, figname, c("Heatmap_centered.pdf"), sep = "_", collapse = "")
  filepath <- file.path(fig_dir, filename)

  pdf(filepath, width = 10, height = 5)  # Adjust size if needed
  plot_heatmap(se_data,
                              column_title = paste("Protein Abundance in", sample_name),
                              col_font_size = 8,
                              clustering_distance = "euclidean",
                              type = "contrast")

  dev.off()
}
quartz_off_screen 
                2 

5 Venn Diagramm

Code
se_data %>% plot_multi_venn(., label_size = 5, plot = T, contrasts = c( "PN_earlyP_vs_Adult",   "PN_earlyP_vs_PN_lateP", "PN_lateP_vs_Adult" ))+
              ggtitle(paste("Venn Diagramm of significantly different Proteins in", str_replace_all(sample_name, "_", " "))) +
              theme(plot.title = element_text(hjust = 0.4, size = 16, face = "bold", margin = ggplot2::margin(t = 15, b = 10)) )+
               scale_fill_gradient(low = "#55b2cf", high = "#d63cba")

Code
if (save) {
  filename <- paste(date, figname, c("Venn_diagramm.pdf"), sep = "_", collapse = "")
  ggsave(filename,  device = NULL , path = fig_dir)
}

6 ORA

6.1 KEGG

Code
## on all contrasts
res_ora2 <- test_ORA(se_data, by_contrast = T, species = "Human", type = "KEGG", pAdjustMethod = "BH", pvalueCutoff = 0.1 )
774 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
10 gene(s) do not match in database.
848 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
11 gene(s) do not match in database.
767 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
9 gene(s) do not match in database.
Star enrich KEGG terms on 3 clusters: PN_earlyP_vs_PN_lateP;PN_lateP_vs_Adult;PN_lateP_vs_Embryo with 777;851;770 ENTREZIDs.
Code
enrichplot::dotplot(res_ora2, showCategory = 20) +
  ggtitle(paste("Over Representation Analysis of", sample_name),subtitle = "Human KEGG Pathways") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold", family = "Arial", margin = margin(t = 15, b = 10)),
        axis.text.y =  element_text(size = 5, margin = margin(t = 10, l = 10, b = 1)))+
  scale_fill_gradient(low = "#55b2cf", high = "#d63cba")+
  theme_cowplot()

Code
if (save) {
  
ggsave(filename = paste(date, figname, "ORA_all_contrasts_kegg.pdf", sep = "_", collapse = ""), device = "pdf",height = 26, width = 16, path = fig_dir)
  # Extract all ORA results as a data frame
as.data.frame(res_ora2) %>% write_xlsx(path =paste(path_results ,paste( figname, "ORA_all_contrasts_kegg.xlsx", sep = "_"), sep = "/"))
}

6.2 GO

Code
## Dotplot function from DOSE package

res_ora2 <- test_ORA(se_data, by_contrast = T, species = "Human", type = "GO", pAdjustMethod = "BH",pvalueCutoff = 0.1 )
774 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
10 gene(s) do not match in database.
848 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
11 gene(s) do not match in database.
767 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
9 gene(s) do not match in database.
Star enrich GO terms on 3 clusters: PN_earlyP_vs_PN_lateP;PN_lateP_vs_Adult;PN_lateP_vs_Embryo with 777;851;770 ENTREZIDs.
Code
enrichplot::dotplot(res_ora2, showCategory = 20) +
  ggtitle(paste("Over Representation Analysis of", sample_name),subtitle = "Human KEGG Pathways") +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold", family = "Arial", margin = margin(t = 15, b = 10)),
        axis.text.y =  element_text(size = 5, margin = margin(t = 10, l = 10, b = 1)))+
  scale_fill_gradient(low = "#55b2cf", high = "#d63cba")+
  theme_cowplot()

Code
if (save) {
  
ggsave(filename = paste(date, figname, "ORA_all_contrasts_GO.pdf", sep = "_", collapse = ""), device = "pdf",height = 26, width = 16, path = fig_dir)
  # Extract all ORA results as a data frame
as.data.frame(res_ora2) %>% write_xlsx(path =paste(path_results ,paste( figname, "ORA_all_contrasts_GO.xlsx", sep = "_"), sep = "/"))
}

6.3 Reactome

Code
## Dotplot function from DOSE package

res_ora2 <- test_ORA(se_data, by_contrast = T, species = "Human", type = c("REACTOME"), pAdjustMethod = "BH",pvalueCutoff = 0.1 )
774 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
10 gene(s) do not match in database.
848 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
11 gene(s) do not match in database.
767 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
9 gene(s) do not match in database.
Star enrich REACTOME terms on 3 clusters: PN_earlyP_vs_PN_lateP;PN_lateP_vs_Adult;PN_lateP_vs_Embryo with 777;851;770 ENTREZIDs.
Code
enrichplot::dotplot(res_ora2, showCategory = 20) +
  ggtitle(paste("Over Representation Analysis of", str_replace_all(sample_name, "_", " ")),subtitle = "Pig Reactome Pathways") +
  theme(plot.title = element_text(hjust = 0.5, size = 12, face = "bold", family = "Arial"),
        axis.text.y =  element_text(size = 2, ))+
  scale_fill_gradientn(colours = viridis(10, begin = 0.25, end = 0.9))+
  scale_fill_gradient(low = "#196f8a", high = "#d63cba")+
  theme_cowplot()

Code
if (save) {
ggsave(filename = paste(date,figname, c("ORA_all_contrasts_Reactome.pdf"), sep = "_", collapse = ""), device = "pdf",height = 20, width = 16, path =fig_dir)
as.data.frame(res_ora2) %>% write_xlsx(path =paste(path_results ,paste( figname, "ORA_all_contrasts_reactome.xlsx", sep = "_"), sep = "/"))
  }

7 GSEA - gene set enrichment

7.1 GO

Code
res_gsea <- DEP2::test_GSEA(se_data, by_contrast = T, species = "Human",type =  "GO", pAdjustMethod = "BH", pvalueCutoff = 0.05)
8297 gene(s) transfrom to ENTREZID from SYMBOL. 6 gene(s) transfrom to ENTREZID from ALIAS. 
74 gene(s) do not match in database.
wdw
Code
## Dotplot function from DOSE package
enrichplot::dotplot(res_gsea, showCategory = 10)+
    scale_fill_gradientn(colours = viridis(10, begin = 0.25, end = 0.9))+
  ggtitle(paste("GSEA of", str_replace_all(sample_name, "_", " ")),subtitle = "Human GO Pathways")+
    scale_fill_gradient(low = "#196f8a", high = "#d63cba")+
  theme_cowplot()

Code
if (save) {
  ggsave(filename = paste(date,figname, c("GSEA_all_contrasts_GO.pdf"), sep = "_", collapse = ""), device = "pdf",height = 20, width = 16, path =fig_dir)
   as.data.frame(res_gsea) %>% write_xlsx(path =paste(fig_dir ,paste( figname, "GSEA_all_contrasts_GO.xlsx", sep = "_"), sep = "/"))
  }

7.2 KEGG

Code
res_gsea <- DEP2::test_GSEA(se_data, by_contrast = T, species = "Human",type =  "KEGG", pAdjustMethod = "BH", pvalueCutoff = 0.05)
8297 gene(s) transfrom to ENTREZID from SYMBOL. 6 gene(s) transfrom to ENTREZID from ALIAS. 
74 gene(s) do not match in database.
hsaaaa
Code
## Dotplot function from DOSE package
enrichplot::dotplot(res_gsea, showCategory = 10)+
    scale_fill_gradientn(colours = viridis(10, begin = 0.25, end = 0.9))+
  ggtitle(paste("GSEA of", str_replace_all(sample_name, "_", " ")),subtitle = "Human KEGG Pathways")+
  scale_fill_gradient(low = "#196f8a", high = "#d63cba")+
  theme_cowplot()

Code
if (save) {
ggsave(filename = paste(date,figname, c("GSEA_all_contrasts_KEGG.pdf"), sep = "_", collapse = ""), device = NULL,height = 20, width = 16, path =fig_dir)
     as.data.frame(res_gsea) %>% write_xlsx(path =paste(path_results ,paste(figname, "GSEA_all_contrasts_Kegg.xlsx", sep = "_"), sep = "/"))
  }

7.3 Reactome

Code
res_gsea <- DEP2::test_GSEA(se_data, by_contrast = T, species = "Human",type =  "REACTOME", pAdjustMethod = "BH", pvalueCutoff = 0.05)
8297 gene(s) transfrom to ENTREZID from SYMBOL. 6 gene(s) transfrom to ENTREZID from ALIAS. 
74 gene(s) do not match in database.
Code
## Dotplot function from DOSE package
enrichplot::dotplot(res_gsea, showCategory = 10)+
    scale_fill_gradientn(colours = viridis(10, begin = 0.2, end = 0.9))+
  ggtitle(paste("GSEA of", str_replace_all(sample_name, "_", " ")),subtitle = "Human Reactome Pathways")+
  scale_fill_gradient(low = "#196f8a", high = "#d63cba")+
  theme_cowplot()

Code
if (save) {
ggsave(filename = paste(date,figname, c("GSEA_all_contrasts_Reac.pdf"), sep = "_", collapse = ""), device = NULL,height = 20, width = 16, path =fig_dir)
     as.data.frame(res_gsea) %>% write_xlsx(path =paste(path_results ,paste( figname, "GSEA_all_contrasts_Reactome.xlsx", sep = "_"), sep = "/"))
  }

8 Protein Protein Interaction analysis

Code
# 3.Load STRING data and perform PPI analysis. 
## It also automatically download data if loacl files is missing. 
PPI_vis = list()
for (contrast in c( "PN_earlyP_vs_Adult",   "PN_earlyP_vs_PN_lateP", "PN_lateP_vs_Adult" )){
  if ((se_data %>% DEP2::get_signicant(contrast = contrast) %>% nrow) > 1) {
      PPI_res <- test_PPI(
        se_data,
        contrasts =  contrast,
        species = "Human"
      )
      print(contrast)
      # igraph network
      PPI_ig <- PPInetwork(PPI_res,returntype = "igraph")
      #igraph::plot.igraph(PPI_ig)}
          # --- visNetwork (only if desired) ---
    PPI_vis[[contrast]] <- PPInetwork(PPI_res, returntype = "visNetwork")
    
  }
}
774 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
10 gene(s) do not match in database.
Input species is Human  The species ID is 9606
fristDownload
fristDownload
fristDownload
load succeed
We couldn't map to STRING: 0% of your identifiers
[1] "PN_earlyP_vs_PN_lateP"
848 gene(s) transfrom to ENTREZID from SYMBOL. 3 gene(s) transfrom to ENTREZID from ALIAS. 
11 gene(s) do not match in database.
We couldn't map to STRING: 0% of your identifiers
[1] "PN_lateP_vs_Adult"

8.1 Protein protein Interation Network PN_earlyP_vs_PN_lateP

Code
names(PPI_vis)
[1] "PN_earlyP_vs_PN_lateP" "PN_lateP_vs_Adult"    
Code
PPI_vis[["PN_earlyP_vs_PN_lateP"]]

` ## Protein protein Interation Network PN_lateP_vs_Adult

Code
#names(PPI_vis)

PPI_vis[["PN_lateP_vs_Adult"]]

9 Selected Proteins

9.1 Labelled in volcano

Embryonic data consists of only 2 replicates that are biological. The third replicate is a technical one of CK1_1

Code
se_data %>% DEP2::get_contrast() -> contrasts
Code
for (contrast in contrasts){
  se_data %>%  plot_volcano(. , contrast = contrast , adjusted = T, 
               add_threshold_line = "intersect", pCutoff  = 0.05, fcCutoff = 1., chooseTolabel = labels_pig, 
               label_size = 6, dot_size = 1, 
               
               up_color = volcano_color[1] , #volcano_color["UP_color"] %>% unlist, 
               down_color =volcano_color[2] 
               )+
    xlim(-7.5,7.5)+
   ylim(0,6.5)+
    theme_cowplot()+
    theme(legend.position = "none")  -> p
  print(p)
  
}

Code
if (save & (aspect_ratio_volcano != 1)) {
  for (contrast in contrasts){
    se_data %>%  plot_volcano(. , contrast = contrast , adjusted = T, 
                 add_threshold_line = "intersect", pCutoff  = 0.05, fcCutoff = 1.,chooseTolabel = labels_pig, 
                 label_size = 6, dot_size = 1,
                 up_color = volcano_color[1] , #volcano_color["UP_color"] %>% unlist, 
                 down_color =volcano_color[2] 
                 )+
      xlim(-7.5,7.5)+
      ylim(0,5.5)+
      theme_cowplot()+
      theme(legend.position = "none", aspect.ratio = aspect_ratio_volcano) -> p

    filename <- paste(date,figname, "Volcano_aspect_label", contrast, ".pdf", sep = "_", collapse = "")
    ggsave(filename,  device = NULL , path = fig_dir)
  }
}
if (save) {
  for (contrast in contrasts){
    se_data %>%  plot_volcano(. , contrast = contrast , adjusted = T, 
                 add_threshold_line = "intersect", pCutoff  = 0.05, fcCutoff = 1., chooseTolabel = labels_pig, 
                 label_size = 6, dot_size = 1,
                 up_color = volcano_color[1] ,
                 down_color =volcano_color[2] 
                 )+
      xlim(-7.5,7.5)+
      ylim(0,5.5)+
      theme_cowplot()+
      theme(legend.position = "none", aspect.ratio = 1) -> p

    filename <- paste(date,figname, "Volcano_sq_label", contrast, ".pdf", sep = "_", collapse = "")
    ggsave(filename,  device = NULL , path = fig_dir)
  }
}

9.2 Multi Heatmaps

Code
plot_heatmap(se_data,
             column_title = paste("Protein Abundance in", str_replace_all(sample_name, "_", " ")),
             col_font_size = 10,
             clustering_distance = "euclidean",
             type = "centered",
             chooseToshow = labels_pig)
Used the existed rejections in the object
Warning: The input is a data frame-like object, convert it to a matrix.

Code
if (save) {
  filename <- paste(date, figname, "Heatmap_selected_proteins.pdf", sep = "_")
  filepath <- file.path(fig_dir, filename)

  pdf(filepath, width = 10, height = 5)  # Adjust size if needed
  plot_heatmap(se_data,
               column_title = paste("Protein Abundance in", str_replace_all(sample_name, "_", " ")),
               col_font_size = 10,
               clustering_distance = "euclidean",
               type = "centered",
               chooseToshow = labels_pig)

  dev.off()
  ##########
  filename <- paste(date, figname, "Heatmap_selected_proteins_sq.pdf", sep = "_")
  filepath <- file.path(fig_dir, filename)

  pdf(filepath, width = 6, height = 6)  # Adjust size if needed
  plot_heatmap(se_data,
               column_title = paste("Protein Abundance in", str_replace_all(sample_name, "_", " ")),
               col_font_size = 10,
               clustering_distance = "euclidean",
               type = "centered",
               chooseToshow = labels_pig)

  dev.off()
}
Used the existed rejections in the object
Warning: The input is a data frame-like object, convert it to a matrix.
Used the existed rejections in the object
Warning: The input is a data frame-like object, convert it to a matrix.
quartz_off_screen 
                2 

10 PCA without Embryo

Code
se_data_filtered <- se_data[, colData(se_data)$condition != "Embryo"]


pca_count <- c(50,150,500,1500)
for (prots in pca_count) {
  p<-plot_pca(se_data_filtered, label = F, n = prots, features = "Proteins", indicate = c("label", "condition"))+
    scale_colour_manual(values = sample_color_vec)+
    theme_cowplot()+
    ggtitle(paste("PCA of top", prots,  "proteins"), subtitle = paste("Total Proteins:" ,
                                                                      nrow(se_data_filtered)))+
  theme(aspect.ratio = aspect_ratio_pca)


  print(p)
  if (save) {
    filename <- paste(date,figname, "PCA_no-embryo", prots, ".pdf", sep = "_", collapse = "")
    ggsave(filename,  device = NULL , path = fig_dir)
    
  }
}

Saving 10 x 5 in image

Saving 10 x 5 in image

Saving 10 x 5 in image

Saving 10 x 5 in image

11 Session Info

Code
sessionInfo()
R version 4.3.3 (2024-02-29)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS 15.6

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Berlin
tzcode source: internal

attached base packages:
[1] stats4    grid      stats     graphics  grDevices utils     datasets 
[8] methods   base     

other attached packages:
 [1] org.Hs.eg.db_3.18.0         AnnotationDbi_1.64.1       
 [3] magrittr_2.0.3              RColorBrewer_1.1-3         
 [5] DEP2_0.5.28.2               R6_2.6.1                   
 [7] limma_3.58.1                MSnbase_2.28.1             
 [9] ProtGenerics_1.34.0         mzR_2.36.0                 
[11] Rcpp_1.1.0                  MsCoreUtils_1.14.1         
[13] SummarizedExperiment_1.32.0 Biobase_2.62.0             
[15] GenomicRanges_1.54.1        GenomeInfoDb_1.38.8        
[17] IRanges_2.36.0              S4Vectors_0.40.2           
[19] BiocGenerics_0.48.1         MatrixGenerics_1.14.0      
[21] matrixStats_1.5.0           viridis_0.6.5              
[23] viridisLite_0.4.2           scales_1.4.0               
[25] ggtext_0.1.2                Cairo_1.6-2                
[27] cowplot_1.2.0               ggridges_0.5.6             
[29] writexl_1.5.4               readxl_1.4.5               
[31] patchwork_1.3.1             ggbreak_0.1.5              
[33] vctrs_0.6.5                 lubridate_1.9.4            
[35] forcats_1.0.0               stringr_1.5.1              
[37] purrr_1.0.4                 readr_2.1.5                
[39] tidyr_1.3.1                 tibble_3.3.0               
[41] tidyverse_2.0.0             dplyr_1.1.4                
[43] ggpubr_0.6.1                ggplot2_3.5.2              
[45] knitr_1.50                 

loaded via a namespace (and not attached):
  [1] fs_1.6.6                    bitops_1.0-9               
  [3] enrichplot_1.22.0           HDO.db_0.99.1              
  [5] httr_1.4.7                  doParallel_1.0.17          
  [7] tools_4.3.3                 doRNG_1.8.6.2              
  [9] backports_1.5.0             lazyeval_0.2.2             
 [11] GetoptLong_1.0.5            withr_3.0.2                
 [13] graphite_1.48.0             gridExtra_2.3              
 [15] preprocessCore_1.64.0       fdrtool_1.2.18             
 [17] cli_3.6.5                   textshaping_1.0.1          
 [19] scatterpie_0.2.5            labeling_0.4.3             
 [21] S7_0.2.0                    randomForest_4.7-1.2       
 [23] proxy_0.4-27                askpass_1.2.1              
 [25] Rsamtools_2.18.0            systemfonts_1.2.3          
 [27] yulab.utils_0.2.0           gson_0.1.0                 
 [29] R.utils_2.13.0              DOSE_3.28.2                
 [31] itertools_0.1-3             rstudioapi_0.17.1          
 [33] impute_1.76.0               RSQLite_2.4.1              
 [35] visNetwork_2.1.2            generics_0.1.4             
 [37] gridGraphics_0.5-1          ggVennDiagram_1.5.4        
 [39] shape_1.4.6.1               car_3.1-3                  
 [41] GO.db_3.18.0                Matrix_1.6-5               
 [43] MALDIquant_1.22.3           abind_1.4-8                
 [45] R.methodsS3_1.8.2           lifecycle_1.0.4            
 [47] yaml_2.3.10                 edgeR_4.0.16               
 [49] carData_3.0-5               qvalue_2.34.0              
 [51] SparseArray_1.2.4           Rtsne_0.17                 
 [53] blob_1.2.4                  crayon_1.5.3               
 [55] lattice_0.22-7              msigdbr_25.1.0             
 [57] KEGGREST_1.42.0             pillar_1.11.0              
 [59] ComplexHeatmap_2.18.0       fgsea_1.28.0               
 [61] rjson_0.2.23                codetools_0.2-20           
 [63] fastmatch_1.1-6             glue_1.8.0                 
 [65] downloader_0.4.1            ggfun_0.1.9                
 [67] pcaMethods_1.94.0           data.table_1.17.8          
 [69] MultiAssayExperiment_1.28.0 treeio_1.26.0              
 [71] png_0.1-8                   org.Mm.eg.db_3.18.0        
 [73] cellranger_1.1.0            gtable_0.3.6               
 [75] assertthat_0.2.1            cachem_1.1.0               
 [77] xfun_0.52                   S4Arrays_1.2.1             
 [79] tidygraph_1.3.1             survival_3.8-3             
 [81] ncdf4_1.24                  iterators_1.0.14           
 [83] statmod_1.5.0               nlme_3.1-168               
 [85] ggtree_3.10.1               bit64_4.6.0-1              
 [87] affyio_1.72.0               colorspace_2.1-1           
 [89] DBI_1.2.3                   DESeq2_1.42.1              
 [91] tidyselect_1.2.1            curl_6.4.0                 
 [93] bit_4.6.0                   compiler_4.3.3             
 [95] graph_1.80.0                glmnet_4.1-9               
 [97] xml2_1.3.8                  DelayedArray_0.28.0        
 [99] shadowtext_0.1.5            affy_1.80.0                
[101] rappdirs_0.3.3              digest_0.6.37              
[103] rmarkdown_2.29              XVector_0.42.0             
[105] TCseq_1.26.0                htmltools_0.5.8.1          
[107] pkgconfig_2.0.3             umap_0.2.10.0              
[109] dbplyr_2.5.0                fastmap_1.2.0              
[111] rlang_1.1.6                 GlobalOptions_0.1.2        
[113] htmlwidgets_1.6.4           farver_2.1.2               
[115] jsonlite_2.0.0              BiocParallel_1.36.0        
[117] mzID_1.40.0                 R.oo_1.27.1                
[119] GOSemSim_2.28.1             RCurl_1.98-1.17            
[121] Formula_1.2-5               GenomeInfoDbData_1.2.11    
[123] ggplotify_0.1.2             babelgene_22.9             
[125] ape_5.8-1                   reticulate_1.42.0          
[127] vsn_3.70.0                  stringi_1.8.7              
[129] ggraph_2.2.1                zlibbioc_1.48.2            
[131] MASS_7.3-60.0.1             plyr_1.8.9                 
[133] parallel_4.3.3              ggrepel_0.9.6              
[135] Biostrings_2.70.3           graphlayouts_1.2.2         
[137] splines_4.3.3               gridtext_0.1.5             
[139] hms_1.1.3                   circlize_0.4.16            
[141] locfit_1.5-9.12             igraph_2.1.4               
[143] QFeatures_1.12.0            ggsignif_0.6.4             
[145] rngtools_1.5.2              clusterProfiler.dplyr_0.0.2
[147] reshape2_1.4.4              XML_3.99-0.18              
[149] evaluate_1.0.4              BiocManager_1.30.26        
[151] tzdb_0.5.0                  foreach_1.5.2              
[153] missForest_1.5              tweenr_2.0.3               
[155] openssl_2.3.3               polyclip_1.10-7            
[157] clue_0.3-66                 ReactomePA_1.46.0          
[159] ggforce_0.5.0               broom_1.0.8                
[161] reactome.db_1.86.2          AnnotationFilter_1.26.0    
[163] tidytree_0.4.6              e1071_1.7-16               
[165] RSpectra_0.16-2             rstatix_0.7.2              
[167] class_7.3-23                ragg_1.4.0                 
[169] clusterProfiler_4.10.1      aplot_0.2.8                
[171] memoise_2.0.1               GenomicAlignments_1.38.2   
[173] cluster_2.1.8.1             timechange_0.3.0